DataFrame类型的数据是带行索引和列索引的二维表数据。下面用pandas包的DataFrame方法将一个二维列表转换为DataFrame对象。[大谦Excel,dqexcel点com]
>>> import pandas as pd #导入pandas包
>>> data=[[1,2,3],[4,5,6],[7,8,9]] #创建二维列表
>>> df=pd.DataFrame(data) #利用二维列表创建DataFrame对象
>>> df
0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
上面df即为利用二维列表创建的DataFrame对象,第1行的0~2为自动生成的列索引标签,第1列的0~2为自动生成的行索引标签,内部3行3列的1~9为df的值。
创建DataFrame对象
上面用二维列表创建了DataFrame对象。使用index参数可以设置行索引标签,使用columns参数可以设置列索引标签。
>>> data=[[1,2,3],[4,5,6],[7,8,9]]
>>> df=pd.DataFrame(data,index=['a','b','c'],columns=['A','B','C'])
>>> df
A B C
a 1 2 3
b 4 5 6
c 7 8 9
下面利用二维元组创建DataFrame对象。
>>> data=((1,2,3),(4,5,6),(7,8,9))
>>> df=pd.DataFrame(data)
>>> df
0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
利用字典创建DataFrame对象。字典中键值对的键表示列索引标签,值用数据区的行数据组成列表表示。
>>> data={'a':[1,2,3],'b':[4,5,6],'c':[7,8,9]}
>>> df=pd.DataFrame(data)
>>> df
a b c
0 1 4 7
1 2 5 8
2 3 6 9
利用NumPy数组创建DataFrame对象。
>>> import numpy as np
>>> data=np.array(([1, 2, 3], [4, 5, 6],[7,8,9]))
>>> df=pd.DataFrame(data)
>>> df
0 1 2
0 1 2 3
1 4 5 6
2 7 8 9
DataFrame对象的描述
创建DataFrame对象以后,可以使用info, describe, dtypes, shape等一系列属性和方法对它进行描述。下面首先创建一个DataFrame对象df。
>>> data=[[1,2,3],[4,5,6],[7,8,9]]
>>> df=pd.DataFrame(data,index=['a','b','c'],columns=['A','B','C'])
>>> df
A B C
a 1 2 3
b 4 5 6
c 7 8 9
用info方法获取df的信息。
>>> df.info()
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, a to c
Data columns(total 3 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 A 3 non-null int64
1 B 3 non-null int64
2 C 3 non-null int64
dtypes: int64(3)
memory usage: 96.0+ bytes
使用info方法获取的DataFrame对象信息包括对象的类型、行索引和列索引信息、每列数据的列标签、非缺失值个数和数据类型、占用内存大小等。
用dtypes属性获取df每列数据的类型。
>>> df.dtypes
A int64
B int64
C int64
dtype: object
用shape属性获取df的行数和列数,用元组给出。
>>> df.shape
(3, 3)
用len函数获取df的行数和列数。
>>> len(df) #行数
3
>>> len(df.columns) #列数
3
用index属性获取df的行索引标签。
>>> df.index
Index(['a', 'b', 'c'], dtype='object')
用columns属性获取df的列索引标签。
>>> df.columns
Index(['A', 'B', 'C'], dtype='object')
用values属性获取df的值。
>>> df.values
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=int64)
用head方法获取前n行数据,默认时n=5。
>>> df.head(2)
A B C
a 1 2 3
b 4 5 6
用tail方法获取后n行数据,默认时n=5。
>>> df.tail(2)
A B C
b 4 5 6
c 7 8 9
用describe方法获取df每列数据的描述统计量,包括数据个数、均值、标准差、最小值、25%分位数、中值、75%分位数、最大值等。
>>> df.describe()
A B C
count 3.0 3.0 3.0
mean 4.0 5.0 6.0
std 3.0 3.0 3.0
min 1.0 14.0 3.0
25% 14.5 3.5 4.5
50% 4.0 5.0 6.0
75% 5.5 6.5 7.5
max 7.0 8.0 9.0
数据索引和切片
创建DataFrame对象后,如果希望提取其中的某行某列或某些行某些列,需要通过索引或切片来实现。可以使用中括号获取单个索引,此时返回的是Series类型;或者中括号里面用一个列表获取多个索引,此时返回的是一个DataFrame类型。
下面创建一个DataFrame对象df。
>>> data=[[1,2,3],[4,5,6],[7,8,9]]
>>> df=pd.DataFrame(data,index=['a','b','c'],columns=['A','B','C'])
>>> df
A B C
a 1 2 3
b 4 5 6
c 7 8 9
用中括号获取列索引标签为" A"的列。
>>> c1=df['A']
>>> c1
a 1
b 4
c 7
Name: A, dtype: int64
查看c1的数据类型。
>>> type(c1)
<class 'pandas.core.series.Series'>
可见,通过索引获取DataFrame数据的单列时得到的是一个Series类型的数据。
下面用loc方法获取行索引标签为的行。
>>> r1=df.loc['a']
>>> r1
A 1
B 2
C 3
Name: a, dtype: int64
查看r1的数据类型。
>>> type(r1)
<class 'pandas.core.series.Series'>
可见,通过索引获取DataFrame数据的单行时得到的是一个Series类型的数据。也可以用iloc方法获取行,与loc方法不同的是,iloc方法的参数为表示行编号的整数,不是标签。
可以通过指定多个索引标签来获取多个行或列。这多个行或列的索引标签组成列表放在中括号中。
>>> c23=df[['A','C']]
>>> c23
A C
a 1 3
b 4 6
c 7 9
>>> r23=df.loc[['a','c']]
>>> r23
A B C
a 1 2 3
c 7 8 9
查看c23和r23的数据类型。
>>> type(c23)
<class 'pandas.core.frame.DataFrame'>
>>> type(r23)
<class 'pandas.core.frame.DataFrame'>
可见,获取多行和多列返回的是DataFrame类型的数据。
上面用中括号获取列,用loc方法也可以获取列,例如:
>>> c4=df.loc[:,'B']
>>> c4
a 2
b 5
c 8
Name: B, dtype: int64
中括号中的冒号表示B标签对应的各行数据全部取。
用中括号获取列时中括号里面输入的是单列的标签,此时返回的是Series类型的数据。如果中括号里面输入的是单列标签组成的列表,返回的则是DataFrame类型的数据。
>>> c5=df[['B']]
>>> c5
B
a 2
b 5
c 8
>>> type(c5)
<class 'pandas.core.frame.DataFrame'>
用中括号索引列以后,引用values属性得到的是NumPy数组数据。
>>> ar=df['B'].values
>>> ar
array([2, 5, 8], dtype=int64)
>>> type(ar)
<class 'numpy.ndarray'>
使用冒号可以对DataFrame数据进行切片。下面的切片取所有行,取列标签"A"到"B"的所有列。
>>> df.loc[:,'A':'B']
A B
a 1 2
b 4 5
c 7 8
下面的切片取行标签"a"到"b"的所有行,取列标签"B"到"C"的所有列。
>>> df.loc['a':'b','B':'C']
B C
a 2 3
b 5 6
下面的切片取行标签"b"及后面的所有行,取列标签"B"及以前的所有列。
>>> df.loc['b':,:'B']
A B
b 4 5
c 7 8
布尔索引
在中括号中使用布尔表达式实现布尔索引。
下面获取df中B列数据大于等于3的行数据。
>>> df[df['B']>=3]
A B C
b 4 5 6
c 7 8 9
获取df中A列数据大于等于2并且C列数据等于9的行数据。
>>> df[(df['A']>=2)&(df['C']==9)]
A B C
c 7 8 9
获取df中B列数据界于4和9之间的行数据。
>>> df[df['B'].between(4,9)]
A B C
b 4 5 6
c 7 8 9
获取df中A列数据取0-5范围内整数的行数据。
>>> df[df['A'].isin(range(6))]
A B C
a 1 2 3
b 4 5 6
获取df中B列数据界于4和9之间的行数据,然后取A列和C列的数据。
>>> df[df['B'].between(4,9)][['A','C']]
A C
b 4 6
c 7 9
找到行标签为"b"的行中大于等于5的数据。
>>> df.loc[['b']]>=5
A B C
b False True True
行标签为"b"的行中大于等于5的数据对应的布尔值为True。